﻿using OT.HikiSecureCenterApis.Res;
using OT.HikiSecureCenterApis.Service.Event.Req;
using OT.HikiSecureCenterApis.Service.Event.Res;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OT.HikiSecureCenterApis.Service.Event
{
    public class EventService : ServiceBase
    {
        public EventService(HikiSecureCenterApis _SecureCenterApis) : base(_SecureCenterApis) { }
        /// <summary>
        /// 按事件类型订阅事件 /api/eventService/v1/eventSubscriptionByEventTypes
        /// 该接口用于满足应用方按事件类型码订阅事件，同一个用户重复订阅相同的事件，接口内部逻辑自动去重，确保不重复投递事件。
        /// 事件订阅接口， 支持订阅平台的所有业务的各种事件类型，具体参考附录D
        /// 本接口要求，三方订阅的时候，要求三方指定的http/https接收事件的服务地址。后续平台产生对应的事件，会推送到此http/https服务地址。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="eventTypes">必填，事件类型,详见附录D
        /// https://open.hikvision.com/docs/2a1f18f349cb4f65ab7857b7ad1c2b24?curNodeId=2a1f18f349cb4f65ab7857b7ad1c2b24
        /// </param>
        /// <param name="eventDest">非必填，指定事件接收的地址，采用restful回调模式，支持http和https，样式如下：http://ip:port/eventRcv或者
        /// https://ip:port/eventRcv不超过1024个字符
        /// 事件接收地址由应用方负责按指定的规范提供，事件接收接口不需要认证
        /// 三方客户收到消息，请注意立即返回HTTP/1.1 200 OK， 否则因为接收太慢，导致事件积压</param>
        /// <param name="subType">非必填，订阅类型，0-订阅原始事件，1-联动事件，2-原始事件和联动事件，不填使用默认值0</param>
        /// <param name="eventLvl">非必填，事件等级，0-未配置，1-低，2-中，3-高
        /// 此处事件等级是指在事件联动中配置的等级
        /// 订阅类型为0时，此参数无效，使用默认值0
        /// 在订阅类型为1时，不填使用默认值[1, 2, 3]
        /// 在订阅类型为2时，不填使用默认值[0, 1, 2, 3]
        /// 数组大小不超过32，事件等级大小不超过31</param>
        /// <returns><see cref="ResParameter{T}"/></returns>
        public async Task<ResParameter<object>?> EventSubscriptionByEventTypesAsync(IList<int> eventTypes, string eventDest = null,
            int? subType = 0, IList<int> eventLvl = null) =>
          await SecureCenterApis.PostAsync<object>("/api/eventService/v1/eventSubscriptionByEventTypes", 1.3, new
          {
              eventTypes = eventTypes,
              eventDest = eventDest,
              subType = subType,
              eventLvl = eventLvl
          });
        /// <summary>
        /// 查询事件订阅信息 /api/eventService/v1/eventSubscriptionView
        /// 应用方根据用户查询事件订阅详情。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.0及以上版本</remarks>
        /// <returns><see cref="ResEventSubscriptionView"/></returns>
        public async Task<ResParameter<ResEventSubscriptionView>?> EventSubscriptionViewAsync() =>
          await SecureCenterApis.PostAsync<ResEventSubscriptionView>("/api/eventService/v1/eventSubscriptionView", 1.0);
        /// <summary>
        /// 按事件类型取消订阅 /api/eventService/v1/eventUnSubscriptionByEventTypes
        /// 应用方指定事件类型取消订阅。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.0及以上版本</remarks>
        /// <param name="eventTypes">必填，事件类型，参考附录D.1，详见附录D
        /// https://open.hikvision.com/docs/2a1f18f349cb4f65ab7857b7ad1c2b24?curNodeId=2a1f18f349cb4f65ab7857b7ad1c2b24
        /// </param>
        /// <returns><see cref="ResParameter{T}"/></returns>
        public async Task<ResParameter<object>?> EventUnSubscriptionByEventTypesAsync(IList<int> eventTypes) =>
          await SecureCenterApis.PostAsync<object>("/api/eventService/v1/eventUnSubscriptionByEventTypes", 1.0, new
          {
              eventTypes = eventTypes
          });
        /// <summary>
        /// 获取联动事件列表 /api/els/v1/events/search
        /// 通过查询条件获取l联动事件信息列表，返回结果分页展示。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="req">参数</param>
        /// <returns><see cref="ResEventsSearch"/></returns>
        public async Task<ResParameter<ResPageData<ResEventsSearch>>?> EventsSearchAsync(ReqEventsSearch req) =>
          await SecureCenterApis.PostAsync<ResPageData<ResEventsSearch>>("/api/els/v1/events/search", 1.3, req);
    }
}
